package co.edu.ucatolica.sislab.persistence.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Carga los sqls generales para cualquier pase de datos
 */
public class SQLGeneralLoader {
	
	/**
	 * Logger
	 */
	private Logger logger = LoggerFactory.getLogger(SQLGeneralLoader.class);
	
	/**
	 * SQLs cargados para cada una de las bases de datos
	 */
	private Hashtable<String,Properties> sqls;
	
	/**
	 * Singleton
	 */
	private static final SQLGeneralLoader singleton = new SQLGeneralLoader();
	
	/** 
	 * Prefijo de la ruta de los archivos que contienen los sqls
	 */
	private static final String SQLS_PREFIX_FILE = "co/edu/ucatolica/sislab/sqlrepository/";
	
    
    /**
     * Carga los sqls definidos
     */
	private SQLGeneralLoader() {
		try {
			sqls = new Hashtable<String, Properties>();
            ClassLoader cl = this.getClass().getClassLoader();
            for ( DatabaseTypes d : DatabaseTypes.values() ) {
            	String archivo = "";
            	if ( PersistenceType.getInstancia().getTipoPersistencia() == PersistenceConstants.TIPO_DATASOURCE ) {
            		archivo = "/";
            	}
            	
            	archivo = archivo + SQLS_PREFIX_FILE + d.getSqlsFile();
            	String nombre = d.toString();
            	
            	logger.info( "Archivo " + archivo + " Nombre " + nombre );
            	InputStream is = cl.getResourceAsStream(archivo);
            	Properties prop  = new Properties();
            	prop.load(is);
            	sqls.put(nombre, prop);
            	is.close();
            }
		} catch (IOException ex) {
            logger.error( "No se pudo cargar los sqls " + ex);
        }
	}
	
	/**
	 * Retorna la instancia
	 * @return Instancia
	 */
	public static SQLGeneralLoader getSingleton() {
		return singleton;
	}
	
	/**
	 * Retorna el sql que se encuentra asociada a la llave indicada
	 * @param sqlKey Llave
	 * @return String que representa el SQL o null de lo contrario
	 */
	public String getSqls( DatabaseTypes d, String sqlKey ) {
		return sqls.get(d.toString()).getProperty(sqlKey);
	}
	
}
